from rest_framework import serializers
from apps.homepage.models import ZtStory

#需求列表信息序列化
class ZtStoryListSerializer(serializers.ModelSerializer):

    # 获取模块名
    module_name = serializers.SerializerMethodField()
    #获取指派人的真实姓名
    assignedTo_realname = serializers.SerializerMethodField()
    #模块列表
    model_path = serializers.SerializerMethodField()

    class Meta:
        model = ZtStory
        fields = ['id', 'title', 'parent', 'status', 'addStage', 'stage','module_name',
                  'assignedTo_realname', 'assignedTo', 'pri', 'category', 'module', 'model_path']

    def get_module_name(self, obj):
        '''
        获取module对应的名称
        '''

        # 获取关联的ZtModule对象
        try:
            module = obj.module
        except:
            # module字段为空（没有PM字段）
            return ''
        # 如果存在关联的User对象，则返回其realname，否则返回None
        return module.name if module else ''

    def get_assignedTo_realname(self, obj):
        '''
        获取module对应的名称
        '''

        # 获取关联的ZtUser对象
        try:
            assignedTo = obj.assignedTo
        except:
            # module字段为空（没有PM字段）
            return ''
        # 如果存在关联的User对象，则返回其realname，否则返回None
        return assignedTo.realname if assignedTo else ''

    def get_model_path(self, obj):
        '''
        获取module对应的名称
        '''

        model = obj.module
        # 如果存在关联的User对象，则返回其realname，否则返回None
        return model.path

    def get_translated_fields(self, obj):
        '''
        转换字段
        '''

        #转换关系
        category_map = {
            'feature': '功能',
            'interface': '接口',
            'performance': '性能',
            'safe': '安全',
            'experience': '体验',
            'improve': '改进',
            'other': '其他',
        }

        # 定义一个字典，键是字段名，值是转换函数
        translations = {
            'category': lambda value: category_map[value],
        }

        # 获取原始值
        original_values = {field_name: getattr(obj, field_name) for field_name in translations}

        # 应用转换
        translated_values = {field_name: translations[field_name](original_value) for field_name, original_value in
                             original_values.items()}

        return translated_values

    def to_representation(self, instance):
        '''
        更新为转换后的值
        '''
        # 获取转换后的值
        translated_values = self.get_translated_fields(instance)

        # 将转换后的值添加到原始序列化器的数据中
        data = super(ZtStoryListSerializer, self).to_representation(instance)
        data.update(translated_values)

        return data

#需求详细信息序列化
class ZtStoryDetailSerializer(serializers.ModelSerializer):

    # 获取模块名
    module_name = serializers.SerializerMethodField()
    #获取指派人的真实姓名
    assignedTo_realname = serializers.SerializerMethodField()
    #描述
    spec = serializers.SerializerMethodField()

    class Meta:
        model = ZtStory
        fields = ['id', 'title', 'parent', 'status', 'addStage', 'stage','module_name',
                  'assignedTo_realname', 'assignedTo', 'pri', 'category', 'spec']

    def get_module_name(self, obj):
        '''
        获取module对应的名称
        '''

        # 获取关联的ZtModule对象
        try:
            module = obj.module
        except:
            # module字段为空（没有PM字段）
            return ''
        # 如果存在关联的User对象，则返回其realname，否则返回None
        return module.name if module else ''

    def get_assignedTo_realname(self, obj):
        '''
        获取module对应的名称
        '''

        # 获取关联的ZtUser对象
        try:
            assignedTo = obj.assignedTo
        except:
            # module字段为空（没有PM字段）
            return ''
        # 如果存在关联的User对象，则返回其realname，否则返回None
        return assignedTo.realname if assignedTo else ''

    def get_spec(self, obj):
        '''
        获取描述信息
        '''
        try:
            # 检查ZtStorySpec是否存在
            if hasattr(obj, 'storySpec_story'):
                # 假设每个story只有一个spec，获取第一个
                spec_instance = obj.storySpec_story.first()
                if spec_instance:
                    return spec_instance.spec
            return ''
        except:
            return ''

    def get_translated_fields(self, obj):
        '''
        转换字段
        '''

        #转换关系
        category_map = {
            'feature': '功能',
            'interface': '接口',
            'performance': '性能',
            'safe': '安全',
            'experience': '体验',
            'improve': '改进',
            'other': '其他',
        }

        # 定义一个字典，键是字段名，值是转换函数
        translations = {
            'category': lambda value: category_map[value],
        }

        # 获取原始值
        original_values = {field_name: getattr(obj, field_name) for field_name in translations}

        # 应用转换
        translated_values = {field_name: translations[field_name](original_value) for field_name, original_value in
                             original_values.items()}

        return translated_values

    def to_representation(self, instance):
        '''
        更新为转换后的值
        '''
        # 获取转换后的值
        translated_values = self.get_translated_fields(instance)

        # 将转换后的值添加到原始序列化器的数据中
        data = super(ZtStoryDetailSerializer, self).to_representation(instance)
        data.update(translated_values)

        return data